/***************************************************************************//**
 * @file     csa37f7x_tk.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-09-26 PM
 * @brief    该文件包含了TK各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
 * @attention
 *  硬件平台: CSA37F70 评估板V1.0 \n
 *  SDK版本： CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date        <th>Version  <th>Author    <th>Description
 * <tr><td>2020-09-26  <td>1.0.0    <td>Chipsea MCU Group  <td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_TK_H__
#define __CSA37F7X_TK_H__

// Include external header file.
#include "csa37f7x.h"
#include "csa37f7x_nvic.h"

#ifdef __cplusplus
extern "C" {
#endif

/** @addtogroup TK 触摸按键(TK)
  CSA37FX70 包含 1 个触摸按键模块(TouchKey)。该模块可以通过检测外部触摸按键电容的改变，
  来判断触摸按键是否被按下。 TK 模块包含 1 个 CVC（Cap-to-Voltage Converter）模块、
  1 个通道补偿DAC、 1 个伪随机时钟产生模块（PRS）以及 1 个 10 位 SAR ADC。<br>
###特性: 
    - 24 路外部单端输入通道
    - 内置 10 位 SAR ADC
    - TK 有 3 种操作模式：单次转换模式，单周期扫描模式，突发模式。
    - 内置 CVC 模块，可配置 8 档累加次数
    - 可配置完成通道扫描后产生系统从 Deepsleep1 转为 Deepsleep2 的请求
    - 每个通道的 ADC 转换结果存储在相应数据寄存器内，并带有扫描有效标志
    - 内置 14 位 CAP DAC（数字/电容转换器），支持电容校准，以提高系统检测精度
    - 内置伪随机时钟产生模块，支持跳频/展频
  @{
*/


/**
* @brief  TK中断类型选择
*/
#define TK_INTR_CVC					   BIT(27)                      /*!<CVC积分结束中断 */ 
#define TK_INTR_SCAN_END               BIT(26)                      /*!<TK扫描完成中断 */ 

/**
* @brief  宏定义检查TK中断类型选择
*/
#define TK_INTR_CHECK(value)				(((value) == TK_INTR_CVC)||\
											((value) == TK_INTR_SCAN_END))


/**
* @brief  宏定义TK输入通道BIT位配置
*/
#define TK_CHANNEL_NUMBER_0			   BIT(0)
#define TK_CHANNEL_NUMBER_1            BIT(1)
#define TK_CHANNEL_NUMBER_2			   BIT(2)
#define TK_CHANNEL_NUMBER_3            BIT(3)
#define TK_CHANNEL_NUMBER_4			   BIT(4)
#define TK_CHANNEL_NUMBER_5            BIT(5)
#define TK_CHANNEL_NUMBER_6			   BIT(6)
#define TK_CHANNEL_NUMBER_7            BIT(7)
#define TK_CHANNEL_NUMBER_8			   BIT(8)
#define TK_CHANNEL_NUMBER_9            BIT(9)
#define TK_CHANNEL_NUMBER_10	       BIT(10)
#define TK_CHANNEL_NUMBER_11           BIT(11)
#define TK_CHANNEL_NUMBER_12		   BIT(12)
#define TK_CHANNEL_NUMBER_13           BIT(13)
#define TK_CHANNEL_NUMBER_14		   BIT(14)
#define TK_CHANNEL_NUMBER_15           BIT(15)
#define TK_CHANNEL_NUMBER_16		   BIT(16)
#define TK_CHANNEL_NUMBER_17           BIT(17)
#define TK_CHANNEL_NUMBER_18		   BIT(18)
#define TK_CHANNEL_NUMBER_19           BIT(19)
#define TK_CHANNEL_NUMBER_20		   BIT(20)
#define TK_CHANNEL_NUMBER_21           BIT(21)
#define TK_CHANNEL_NUMBER_22		   BIT(22)
#define TK_CHANNEL_NUMBER_23           BIT(23)


/**
* @brief  TK数据寄存器通道选择
*/
typedef enum
{
	TK_DR_CHANNEL_0  = 0x00,                                        /*!< 数据寄存器通道0  */
	TK_DR_CHANNEL_1  = 0x01,                                        /*!< 数据寄存器通道1  */
	TK_DR_CHANNEL_2  = 0x02,                                        /*!< 数据寄存器通道2  */
	TK_DR_CHANNEL_3  = 0x03,                                        /*!< 数据寄存器通道3  */
	TK_DR_CHANNEL_4  = 0x04,                                        /*!< 数据寄存器通道4  */
	TK_DR_CHANNEL_5  = 0x05,                                        /*!< 数据寄存器通道5  */
	TK_DR_CHANNEL_6  = 0x06,                                        /*!< 数据寄存器通道6  */
	TK_DR_CHANNEL_7  = 0x07,                                        /*!< 数据寄存器通道7  */
	TK_DR_CHANNEL_8  = 0x08,                                        /*!< 数据寄存器通道8  */
	TK_DR_CHANNEL_9  = 0x09,                                        /*!< 数据寄存器通道9  */
	TK_DR_CHANNEL_10 = 0x0A,                                        /*!< 数据寄存器通道10  */
	TK_DR_CHANNEL_11 = 0x0B,                                        /*!< 数据寄存器通道11  */
	TK_DR_CHANNEL_12 = 0x0C,                                        /*!< 数据寄存器通道12  */
	TK_DR_CHANNEL_13 = 0x0D,                                        /*!< 数据寄存器通道13  */
	TK_DR_CHANNEL_14 = 0x0E,                                        /*!< 数据寄存器通道14  */
	TK_DR_CHANNEL_15 = 0x0F,                                        /*!< 数据寄存器通道15  */
	TK_DR_CHANNEL_16 = 0x10,                                        /*!< 数据寄存器通道16  */
	TK_DR_CHANNEL_17 = 0x11,                                        /*!< 数据寄存器通道17  */
	TK_DR_CHANNEL_18 = 0x12,                                        /*!< 数据寄存器通道18  */
	TK_DR_CHANNEL_19 = 0x13,                                        /*!< 数据寄存器通道19  */
	TK_DR_CHANNEL_20 = 0x14,                                        /*!< 数据寄存器通道20  */
	TK_DR_CHANNEL_21 = 0x15,                                        /*!< 数据寄存器通道21  */
	TK_DR_CHANNEL_22 = 0x16,                                        /*!< 数据寄存器通道22  */
	TK_DR_CHANNEL_23 = 0x17,                                        /*!< 数据寄存器通道23  */
}tk_dr_channel_t;

/**
* @brief  TK CAP DAC 数据补偿通道选择
*/
typedef enum
{
	TK_CAP_CHANNEL_0  = 0x00,                                       /*!< CAP DAC 数据补偿通道0  */
	TK_CAP_CHANNEL_1  = 0x01,                                       /*!< CAP DAC 数据补偿通道1  */
	TK_CAP_CHANNEL_2  = 0x02,                                       /*!< CAP DAC 数据补偿通道2  */
	TK_CAP_CHANNEL_3  = 0x03,                                       /*!< CAP DAC 数据补偿通道3  */
	TK_CAP_CHANNEL_4  = 0x04,                                       /*!< CAP DAC 数据补偿通道4  */
	TK_CAP_CHANNEL_5  = 0x05,                                       /*!< CAP DAC 数据补偿通道5  */
	TK_CAP_CHANNEL_6  = 0x06,                                       /*!< CAP DAC 数据补偿通道6  */
	TK_CAP_CHANNEL_7  = 0x07,                                       /*!< CAP DAC 数据补偿通道7  */
	TK_CAP_CHANNEL_8  = 0x08,                                       /*!< CAP DAC 数据补偿通道8  */
	TK_CAP_CHANNEL_9  = 0x09,                                       /*!< CAP DAC 数据补偿通道9  */
	TK_CAP_CHANNEL_10 = 0x0A,                                       /*!< CAP DAC 数据补偿通道10 */
	TK_CAP_CHANNEL_11 = 0x0B,                                       /*!< CAP DAC 数据补偿通道11 */
	TK_CAP_CHANNEL_12 = 0x0C,                                       /*!< CAP DAC 数据补偿通道12 */
	TK_CAP_CHANNEL_13 = 0x0D,                                       /*!< CAP DAC 数据补偿通道13 */
	TK_CAP_CHANNEL_14 = 0x0E,                                       /*!< CAP DAC 数据补偿通道14 */
	TK_CAP_CHANNEL_15 = 0x0F,                                       /*!< CAP DAC 数据补偿通道15 */
	TK_CAP_CHANNEL_16 = 0x10,                                       /*!< CAP DAC 数据补偿通道16 */
	TK_CAP_CHANNEL_17 = 0x11,                                       /*!< CAP DAC 数据补偿通道17 */
	TK_CAP_CHANNEL_18 = 0x12,                                       /*!< CAP DAC 数据补偿通道18 */
	TK_CAP_CHANNEL_19 = 0x13,                                       /*!< CAP DAC 数据补偿通道19 */
	TK_CAP_CHANNEL_20 = 0x14,                                       /*!< CAP DAC 数据补偿通道20 */
	TK_CAP_CHANNEL_21 = 0x15,                                       /*!< CAP DAC 数据补偿通道21 */
	TK_CAP_CHANNEL_22 = 0x16,                                       /*!< CAP DAC 数据补偿通道22 */
	TK_CAP_CHANNEL_23 = 0x17,                                       /*!< CAP DAC 数据补偿通道23 */
}tk_capdac_channel_t;

/**
* @brief  TK中断状态
*/
typedef enum
{
	TK_INTERRUPT_CVC_IF    = 0x00,                                  /*!<CVC积分结束事件标志位 */ 
	TK_INTERRUPT_TKSCAN_IF = 0x01,                                  /*!<TK通道扫描完成事件标志 */ 
}tk_intflag_t;

/**
* @brief  TK 触发设置
*/
typedef enum
{
	TK_TRIGEER_BY_CVC 	   = 0x00,                                  /*!<A/D转换由CVC积分结束启动 */ 
	TK_TRIGEER_BY_SOFTWARE = 0x01,                                  /*!<A/A/D转换由软件ADST启动 */ 
}tk_trgs_t;

/**
* @brief  TK 通道模式选择
*/
typedef enum
{
	TK_DIFF_SEL_SINGLE_MODE        = 0x00,                          /*!<采用单端输入模式 */ 
	TK_DIFF_SEL_DIFFERRENTIAL_MODE = 0x01,                          /*!<采用全差分输入模式 */ 
}tk_diff_t;

/**
* @brief  TK 扫描模式选择
*/
typedef enum
{
	TK_SCAN_MODE_BY_SINGLE_CYCLE = 0x00,                            /*!<单周期扫描方式 */
	TK_SCAN_MODE_BY_ONE_TIME     = 0x01,                            /*!<单次转换模式 */
	TK_SCAN_MODE_BY_SUDDEN       = 0x02,                            /*!<突发模式 */
}tk_scan_mode_t;

/**
* @brief  CVC累加次数选择
*/
typedef enum
{
	TK_CVC_ACMU_8TIMES  = 0x00,                                     /*!< CVC累加次数为8次 */
	TK_CVC_ACMU_16TIMES = 0x01,                                     /*!< CVC累加次数为16次 */
	TK_CVC_ACMU_24TIMES = 0x02,                                     /*!< CVC累加次数为24次 */
	TK_CVC_ACMU_32TIMES = 0x03,                                     /*!< CVC累加次数为32次 */
	TK_CVC_ACMU_40TIMES = 0x04,                                     /*!< CVC累加次数为40次 */
	TK_CVC_ACMU_48TIMES = 0x05,                                     /*!< CVC累加次数为48次 */
	TK_CVC_ACMU_56TIMES = 0x06,                                     /*!< CVC累加次数为56次 */        
	TK_CVC_ACMU_64TIMES = 0x07,                                     /*!< CVC累加次数为64次 */
}tk_cvc_acmu_t;

/**
* @brief  TK时钟展频选择
*/
typedef enum
{
	TK_SYSCLK_200K = 0x00,                                          /*!< PRS输出时钟为200kHz */
	TK_SYSCLK_185K = 0x01,                                          /*!< PRS输出时钟为185kHz */
	TK_SYSCLK_170K = 0x02,                                          /*!< PRS输出时钟为170kHz */
	TK_SYSCLK_160K = 0x03,                                          /*!< PRS输出时钟为160kHz */
	TK_SYSCLK_150K = 0x04,                                          /*!< PRS输出时钟为150kHz */
	TK_SYSCLK_140K = 0x05,                                          /*!< PRS输出时钟为140kHz */
	TK_SYSCLK_130K = 0x06,                                          /*!< PRS输出时钟为130kHz */          
	TK_SYSCLK_120K = 0x07,                                          /*!< PRS输出时钟为120kHz */
	TK_SYSCLK_115K = 0x08,                                          /*!< PRS输出时钟为115kHz */ 
	TK_SYSCLK_110K = 0x09,                                          /*!< PRS输出时钟为110kHz */ 
	TK_SYSCLK_105K = 0x0A,                                          /*!< PRS输出时钟为105kHz */ 
	TK_SYSCLK_100K = 0x0B,                                          /*!< PRS输出时钟为100kHz */ 
	TK_SYSCLK_96K  = 0x0C,                                          /*!< PRS输出时钟为96 kHz */ 
	TK_SYSCLK_92K  = 0x0D,                                          /*!< PRS输出时钟为92 kHz */ 
	TK_SYSCLK_88K  = 0x0E,                                          /*!< PRS输出时钟为88 kHz */ 
	TK_SYSCLK_85K  = 0x0F,                                          /*!< PRS输出时钟为85 kHz */ 
}tk_sysclk_t;

/**
* @brief  CVC时钟选择
*/
typedef enum
{
	CVC_CLK_CTRL_ASYN     = 0x00,                                   /*!< CVC直接使用TK_CLK输入 */
    CVC_CLK_CTRL_SYN_DIV2 = 0x02,                                   /*!< CVC使用TK_CLK的2分频输入 */
	CVC_CLK_CTRL_SYN_DIV4 = 0x03,                                   /*!< CVC使用TK_CLK的4分频输入 */
}tk_cvc_clk_t;

/**
* @brief  PRS时钟展频范围选择
*/
typedef enum
{
	TK_PRS_SEL_NORMAL = 0x00,                                       /*!< 输出PRS时钟为默认展频范围 */
	TK_PRS_SEL_DOUBLE = 0x01,                                       /*!< 输出PRS时钟展频范围加倍 */
}tk_prs_sel_t;

/**
* @brief  TK 配置结构体
*/
typedef struct
{
	enable_state_t tk_sleepmode;                                    /*!< 在深度睡眠状态1中完成TK扫描后，是否启用深度睡眠模式2选择 */ 
	tk_trgs_t tk_trgs_mode;                                         /*!< TK 触发设置 */ 
    tk_scan_mode_t tk_scan_mode;                                    /*!< TK 扫描模式 */ 
	tk_diff_t tk_channel_mode;                                      /*!< 通道模式选择 */  
	tk_cvc_acmu_t tk_cvc_cumulative_numble;                         /*!< CVC累加次数选择 */                
	tk_cvc_clk_t tk_cvc_clk_mode;                                   /*!< CVC时钟模式选择 */ 
	tk_sysclk_t tk_sysclk_select;                                   /*!< TK时钟展频选择 */ 
	tk_prs_sel_t tk_prs_sel_mode;                                   /*!< PRS时钟展频范围选择 */ 
	enable_state_t tk_prs_mode;                                     /*!< PRS模式使能选择 */ 
	enable_state_t tk_power_mode;                                   /*!< TK模块电路使能 */ 
}tk_config_t;

/**@brief		    设置CVC模块累加次数
 *
 * @param[in]	    acum     累加次数选择
 * @return		    无
*/
void tk_cvc_cumulative_number_set(tk_cvc_acmu_t acum);

/**@brief		    初始化TK
 *
 * @param[in]	    p_tk_config     TK配置结构体
 * @return		    无
*/
void tk_init(tk_config_t  *p_tk_config);

/**@brief		    深度睡眠1状态下, 设置TK扫描完成是否进入深度睡眠2
 *
 * @param[in]	    enable_flag     使能/禁止选择
 * @return		    无
*/
void tk_scan_finish_into_sleep_set(enable_state_t  enable_flag);

/**@brief		    使能TK模块ADC
 *
 * @return		    无
*/
void tk_adc_enable(void);

/**@brief		    关闭TK模块ADC
 *
 * @return		    无
*/
void tk_adc_disable(void);

/**@brief		    启动ADC转换
 *
 * @return		    无
*/
void tk_adc_trans_start(void);

/**@brief		    停止ADC转换
 *
 * @return		    无
*/
void tk_adc_trans_stop(void);

/**@brief		    读取当前扫描通道
 *
 * @return		    当前扫描通道，返回值 = 3，则表示通道0和1使能
*/
uint8_t tk_present_scan_channel_get(void);

/**@brief		    关闭所有的TK采样通道
 *
 * @return		    无
*/
void tk_sample_channel_disable_all(void);

/**@brief		    使能选择TK输入通道
 *
 * @param[in]	    tk_channelx     所选择的TK输入通道，TK_CHANNEL_NUMBER_0-23
 * @return		    无
*/
void tk_sample_channel_enable_set(uint32_t tk_channelx);

/**@brief		    读取选择的通道的TK数据
 *
 * @param[in]	    tk_dr_channel     TK数据寄存器通道选择，TK_DR_CHANNEL_0-23
 * @param[out]	    dat      TK通道数据（指针）
 * @return		    数据的有效性：invalid：无效，valid有效
*/
result_valid_t tk_sample_channel_data_read(tk_dr_channel_t tk_dr_channel, uint32_t *dat);

/**@brief		    TK模块电路使能
 *
 * @return		    无
*/
void tk_power_enable(void);

/**@brief		    关闭TK模块电路
 *
 * @return		    无
*/
void tk_power_disable(void);

/**@brief		    启动TK按键扫描
 *
 * @param[in]	    enable_flag     使能/禁止选择
 * @return		    无
*/
void tk_scan_start_set(enable_state_t  enable_flag);

/**@brief		    CAP_DAC校准数据写入
 *
 * @param[in]	    channel     CAP DAC 数据补偿通道选择:TK_CAP_CHANNEL_0~TK_CAP_CHANNEL_23
 * @param[in]	    value     补偿值
 * @return		    无
*/
void tk_cap_dac_calibration_data_write(tk_capdac_channel_t channel,uint16_t value);

/**@brief		    配置TK的相关中断使能或禁止
 *
 * @param[in]	    tk_int_sel     所选的中断类型TK_INTR_CVC/ TK_INTR_SCAN_END
 * @param[in]	    enable_flag     使能/禁止选择
 * @return		    无
*/
void tk_interrupt_config(uint32_t tk_int_sel, enable_state_t enable_flag);

/**@brief		    获取TK相关中断状态
 *
 * @param[in]	    flag     输入相应的中断选择位
 * @return		    0 = 无CVC 积分结束事件或 无扫描完成事件；1 = 有CVC 积分结束事件或 有扫描完成事件
*/
uint8_t tk_interrupt_status_get(tk_intflag_t flag);

/**@brief		    TK中断标志清除
 *
 * @param[in]	    flag     待清除的中断选择位
 * @return		    无
*/
void tk_interrupt_flag_clear(tk_intflag_t flag);

/**@brief		    CVC重启使能
 *
 * @return		    无
*/
void tk_cvc_rst(void);

/**@brief		    读取CAP_DAC校准数据
 *
 * @param[in]	    channel     CAP DAC 数据补偿通道选择:TK_CAP_CHANNEL_0~TK_CAP_CHANNEL_23
 * @return		    CAP_DAC校准数据
*/
uint16_t tk_cap_dac_calibration_data_read(tk_capdac_channel_t channel);

/**@brief		    等待扫描完成
 *
 * @return		    无
*/
void tk_wait_scan_finish(void);

/*@}*/ /* end of group TK */

#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_TK_H__


/*** (C) COPYRIGHT 2020 Chipsea Technologies (Shenzhen) Corp. ***/
